/**
* 标题：自定义日志存储在txt中
* 说明：
1. 自定义日志存储在txt中
2. 生成的文件存放在对应app目录下的 _doc/logs 文件夹中
··· js
// main.js 文件进行全局挂载
// 引入logger
import logger from  '@/components/libs/logger.js'
// 挂载logger
uni.$console = logger;
```
...
* 使用方法 *********************************************
* 1. 使用全局挂载的方式(和console)一致
* uni.$console.debug('日志信息');
* uni.$console.log('日志信息');
* uni.$console.info('日志信息');
* uni.$console.warn('日志信息');
* uni.$console.error('日志信息');

* 2. 在普通js文件单独引入的方法
* import logger from '@/path/to/the/logger.js'
* logger.log('日志信息')
* logger.error('日志信息')

 */

// 日志存放的文件夹目录
const LOG_DIR = '_doc/logs';
/**
 * 获取当前时间
 */
function getDayStr() {
  var y, m, d, h, mm, s;
  var date = new Date();
  y = date.getFullYear();
  m = date.getMonth() + 1;
  d = date.getDate();
  m = m < 10 ? '0' + m : m;
  d = d < 10 ? '0' + d : d;
  // //console.log('日期:',y,m,d)
  // return '20220607' // 生成指定日期
  return '' + y + m + d;
}
/**
 * 获取当前时间，yyyy-mm-dd hh:mm:ss
 * 用于记录日志的时间信息
 */
function getTimeStr() {
  var y, m, d, h, mm, s;
  var date = new Date();
  y = date.getFullYear();
  m = date.getMonth() + 1;
  d = date.getDate();
  h = date.getHours();
  mm = date.getMinutes();
  s = date.getSeconds();
  m = m < 10 ? '0' + m : m;
  d = d < 10 ? '0' + d : d;
  h = h < 10 ? '0' + h : h;
  mm = mm < 10 ? '0' + mm : mm;
  s = s < 10 ? '0' + s : s;
  var timeStr = y + '-' + m + '-' + d + ' ' + h + ':' + mm + ':' + s;
  return timeStr;
}
/**
 * 日志TXT的名称
 */
function getLogFileName() {
  const txt = LOG_DIR + '/' + getDayStr() + '.txt';
  // //console.log('TXT文件名称:',txt)
  return txt;
}
let tasks = [];
/**
 * @param {Object} tag 标识
 * @param {Object} msg 空格
 */
function writeToTxt(tag) {
  return new Promise((resolve, reject) => {
    let msgs = '';
    for (var i = 1; i < arguments.length; i++) {
      const item = arguments[i];
      if (
        typeof item == 'string' ||
        typeof item == 'number' ||
        typeof item == 'boolean'
      ) {
        msgs = msgs + '\t' + item;
      } else {
        msgs = msgs + '\t' + JSON.stringify(item);
      }
    }
    // 获取当前时间
    let txt_msg = getTimeStr() + '\t[' + tag + ']\t' + msgs + '\n';
    if (tag == 'ERROR') {
      console.error(txt_msg);
    } else {
      // //console.log(txt_msg);
    }
    tasks.push(txt_msg);
    resolve(true);
  }).then(() => {
    clearTask();
  });
}
// 清空日志到日志文件
function clearTask() {
	// #ifdef APP-PLUS
  if (tasks.length === 0) {
    return;
  }
  const txt_msg = tasks.join('');
  tasks = [];
  const fileName = getLogFileName();
  plus.io.requestFileSystem(
    plus.io.PRIVATE_DOC,
    fs => {
      fs.root.getFile(
        fileName,
        {
          create: true,
        },
        function (entry) {
          // 写入到本地
          entry.createWriter(
            function (writer) {
              writer.onwrite = function (e) {
                // console.log("Write data success!");
               // console.log('写入本地日志 >>>> ', txt_msg);
              };
              writer.onerror = function (e) {
                console.eror(
                  '写入本地日志失败 >>>> ',
                  JSON.stringify(e),
                  txt_msg
                );
              };
              // Write data to the end of file.
              writer.seek(writer.length);
              writer.write(txt_msg);
            },
            function (e) {
              console.log(e.message);
            }
          );
        }
      );
    },
    function (e) {
      console.log('Request file system failed: ' + JSON.stringify(e));
    }
  );
	// #endif
}

/**
 * 压缩所有的日志为zip
 */
function zipLogDir(callback) {
  //console.log('开始压缩');
  // #ifdef APP-PLUS
  var zipFile = '_doc/logs.zip';
  var targetPath = LOG_DIR;

  // 开始压缩文件
  console.log('开始压缩', targetPath, zipFile);
  plus.zip.compress(
    targetPath,
    zipFile,
    function (res) {
      console.log('开始压缩 Compress success!', res);
      if (callback) {
        callback({
          success: true,
          res,
          zipPath: zipFile,
        });
      }
    },
    function (error) {
      console.error('开始压缩 Compress error!', error);
      if (callback) {
        callback({
          success: false,
          error,
        });
      }
    }
  );
  // #endif
}
/**
 * 删除多少天之前的日志文件
 */
function removeFile(durationDay) {
  return new Promise((resolve, reject) => {
    if (!durationDay || durationDay <= 0) {
      durationDay = 10;
    }
    var dirPath = LOG_DIR;
    plus.io.resolveLocalFileSystemURL(
      dirPath,
      function (entry) {
        //读取这个目录对象
        var directoryReader = entry.createReader();
        // console.log(dirPath)
        //读取这个目录下的所有文件
        directoryReader.readEntries(
          function (entries) {
            console.log('日志文件数量', entries.length);
            //如果有才操作
            if (entries.length > 0) {
              let now = getDayStr();
              for (let file of entries) {
                // console.log(file.name);
                // 判断需要保留的日志
                let day = file.name.replace('.txt', '');
                // console.log(parseInt(day) + parseInt(durationDay) < parseInt(now));
                // console.log(parseInt(day));
                // console.log(parseInt(durationDay));
                // console.log(parseInt(day) + parseInt(durationDay));
                // console.log(parseInt(now));
                if (parseInt(day) + parseInt(durationDay) < parseInt(now)) {
                  console.log('需要删除的日志是', file.name);
                  try {
                    file.remove(
                      function () {
                        console.error('删除日志成功', file.name);
                      },
                      function (e) {
                        console.error('删除日志失败', file.name, e);
                      }
                    );
                  } catch (e) {
                    console.error('删除日志失败', file.name, e);
                  }
                } else {
                  console.log('保留的日志是', file.name);
                }
              } // for
            } // if
            resolve();
          },
          function (e) {
            console.log('读取文件失败：' + e.message);
            resolve();
          }
        );
      },
      function (e) {
        console.log('读取目录失败：' + e.message);
        resolve();
      }
    );
  });
}

/**
 * 自定义TXT日志
 */
const logger = {
  /**
   * @param {Object} msg 日志信息的字符串信息
   */
  debug: function () {
    writeToTxt('DEBUG', ...arguments);
    console.debug(...arguments);
  },
  log: function () {
    writeToTxt('LOG', ...arguments);
    console.log(...arguments);
  },
  info: function () {
    writeToTxt('INFO', ...arguments);
    //console.info(...arguments);
  },
  warn: function () {
    writeToTxt('WARN', ...arguments);
    console.warn(...arguments);
  },
  error: function () {
    writeToTxt('ERROR', ...arguments);
    console.error(...arguments);
  },
  /**
   * @param {String} tag 日志信息的自定义信息
   */
  tag: function (tag) {
    writeToTxt(tag, ...arguments);
    console.log(...arguments);
  },
  /**
   * @param {Object} msg 日志信息的字符串信息
   */
  network: function () {
    writeToTxt('NETWORK', ...arguments);
    console.log(...arguments);
  },
  /**
   * @param {Object} msg 日志信息的字符串信息
   */
  logIpExchange: function (msg) {
    writeToTxt('IpExchange', ...arguments);
    console.log(...arguments);
  },
  /**
   * 压缩成zip，并返回路径
   * @param {Object} callback
   */
  zipLogDir,
  /**
   * 删除多少${durationDay}天之前的日志文件
   * @param {Object} durationDay 默认是10天
   */
  removeFile,
  /**
   * 主要使用方法。先移除
   * @param {Object} callback
   */
  removeFileAndZipLogDir(callback) {
    removeFile().then(() => {
      zipLogDir(callback);
    });
  },
};

export default logger;
